package com.jytc.framework.bo.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jytc.framework.bo.FwDeptBO;
import com.jytc.framework.bo.FwUserBO;
import com.jytc.framework.commons.Page;
import com.jytc.framework.commons.PropertyFilter;
import com.jytc.framework.constants.CommonConstants;
import com.jytc.framework.constants.ResultConstants;
import com.jytc.framework.dao.FwDeptDAO;
import com.jytc.framework.dto.FwDeptDTO;
import com.jytc.framework.po.FwDept;
import com.jytc.framework.po.FwUser;

/**
 * @title: FSysDeptBOImpl.java
 * @description: 单位管理业务操作类

 * 
 * @author: dongyuese
 *
 */
@Service
public class FwDeptBOImpl implements FwDeptBO
{
	/**
	 * 单位管理信息数据访问对象
	 */
	@Autowired
	private FwDeptDAO fwDeptDAO;

	/**
	 * 区域信息业务操作对象
	 */
	//@Autowired
	//private FSysRegionBO sysRegionBO;

	/**
	 * 用户信息业务操作对象
	 */
	@Autowired
	private FwUserBO fwUserBO;

	/**
	 * 保存单位管理信息
	 * @param sysDeptDTO　单位管理信息数据传输对象
	 * @return　保存成功或失败

	 */
	@Transactional(readOnly = false, rollbackFor = Throwable.class)
	public int save(FwDeptDTO fwDeptDTO) throws Exception
	{
		FwDept fwDept = new FwDept();
		BeanUtils.copyProperties(fwDept, fwDeptDTO);
		//fwDept.setRegionRange(CommonUtils.arrayToString(fwDeptDTO.getRegionRanges(), CommonConstants.SPLIT_SYMBOL_COMMA));

		//判断是否已经存在同名单位
		if (fwDeptDAO.findUnique("DeptName", fwDeptDTO.getDeptName()) == null)
		{
			fwDeptDAO.save(fwDept);
			return ResultConstants.INSERT_SUCCEED;
		}
		return ResultConstants.INSERT_FAILED;
	}

	/**
	 * 根据单位ID查询单位信息
	 * @param DeptId　单位ID
	 * @return　单位管理信息数据传输对象
	 */
	public FwDeptDTO findById(Integer DeptId) throws Exception
	{
		FwDept fwDept = fwDeptDAO.findById(DeptId);
		FwDeptDTO fwDeptDTO = new FwDeptDTO();
		BeanUtils.copyProperties(fwDeptDTO, fwDept);
		return fwDeptDTO;
	}

	/**
	 * 查询所有的单位
	 * @return 单位集合
	 * @throws Exception
	 */
	public List<FwDept> findAll() throws Exception
	{
		return fwDeptDAO.findAll();
	}

	/**
	 * 根据单位ID删除单位信息
	 * @param DeptId　单位ID
	 * @return　删除成功或失败

	 */
	@Transactional(readOnly = false, rollbackFor = Throwable.class)
	public int deleteById(Integer DeptId) throws Exception
	{
		//判断是否有下级单位，如果有下级单位则不允许删除
		List<FwDept> DeptList = this.queryByParentId(DeptId);
		if ((DeptList != null) && (!DeptList.isEmpty()))
		{
			return CommonConstants.IS_EXIST_CHILD_CORP;
		}
		//有用户引用的单位不能被删除
		if (!this.validationCorp(DeptId))
		{
			fwDeptDAO.deleteById(DeptId);
			return ResultConstants.DELETE_SUCCEED;

		} else
		{
			return CommonConstants.CORP_USER_QUOTED;
		}
	}

	/**
	 * 根据单位ID集合批量删除单位信息
	 * @param DeptIds　单位ID集合
	 * @return　删除成功或失败

	 * @throws Exception
	 */
	@Transactional(readOnly = false, rollbackFor = Throwable.class)
	public int deleteByIds(Integer[] DeptIds) throws Exception
	{
		for (Integer DeptId : DeptIds)
		{
			//判断是否有下级单位，如果有下级单位则不允许删除
			List<FwDept> DeptList = this.queryByParentId(DeptId);
			if ((DeptList == null) && (DeptList.isEmpty()))
			{
				//有用户引用的单位不能被删除
				if (!this.validationCorp(DeptId))
				{
					fwDeptDAO.deleteById(DeptId);
				}
			}
		}
		return ResultConstants.DELETE_SUCCEED;
	}

	/**
	 * 按照条件分页查询单位信息
	 * @param page　分页信息
	 * @param filters　过滤条件列表
	 * @return　单位信息集合
	 * @throws Exception
	 */
	public Page query(Page page, List<PropertyFilter> filters) throws Exception
	{
		Page pageTemp = fwDeptDAO.findByPage(page, filters);
		List tempList = pageTemp.getResult();
		List resultList = new ArrayList();
		if (tempList != null)
		{
			FwDept fwDept = null;
			FwDept tempDept = null;
			for (int i = 0; i < tempList.size(); i++)
			{
				fwDept = (FwDept) tempList.get(i);
				FwDeptDTO fwDeptDTO = new FwDeptDTO();
				BeanUtils.copyProperties(fwDeptDTO, fwDept);

				//如果存在上级单位，则将父ID转化为上级单位名称
				if (fwDept.getParentDeptId() != 0)
				{
					tempDept = fwDeptDAO.findById(fwDept.getParentDeptId());
					if (tempDept == null)
					{
						fwDeptDTO.setParentName(CommonConstants.NO_PARENT_CORP);
					} else
					{
						fwDeptDTO.setParentName(tempDept.getDeptName());
					}
				} else
				{
					fwDeptDTO.setParentName(CommonConstants.NO_PARENT_CORP);
				}
				resultList.add(fwDeptDTO);
			}
		}
		pageTemp.setResult(resultList);
		return pageTemp;
	}

	/**
	 * 查询符合条件的单位信息

	 * 
	 * @param filters
	 * @return
	 * @throws Exception
	 */
	public List<FwDept> query(List<PropertyFilter> filters) throws Exception
	{
		return fwDeptDAO.findByFilters(filters);
	}

	/**
	 * 按照属性名及对应属性值查询单位信息

	 * @param propertyName　属性名
	 * @param value　属性值

	 * @return　单位信息集合
	 * @throws Exception
	 */
	public List<FwDept> findByCorpType(String propertyName, Object value) throws Exception
	{
		return fwDeptDAO.findByProperty(propertyName, value);
	}

	/**
	 * 验证单位是否被用户引用，被引用返回true，否则返回false
	 * @param DeptId 单位ID
	 * @return
	 * @throws Exception
	 */
	private boolean validationCorp(Integer DeptId) throws Exception
	{
		List<FwUser> fwLoginList = fwUserBO.queryByCorpAndValidTag(DeptId, null);
		if ((fwLoginList == null) || (fwLoginList.isEmpty()))
		{
			return false;
		}
		return true;
	}

	/**
	 * 修改单位管理信息
	 * @param sysDeptDTO　单位管理信息数据传输对象
	 * @return　修改成功或失败

	 */
	@Transactional(readOnly = false, rollbackFor = Throwable.class)
	public int update(FwDeptDTO fwDeptDTO) throws Exception
	{
		FwDept fwDeptTemp = fwDeptDAO.findUnique("DeptName", fwDeptDTO.getDeptName());

		//修改后的单位名是否跟原有的单位名存在重复
		if ((fwDeptTemp != null) && (fwDeptTemp.getDeptId().longValue() != fwDeptDTO.getDeptId().longValue()))
		{
			return CommonConstants.CORP_IS_EXIST;
		}

		//如果将单位修改为无效状态，则需要判断该单位是否被用户引用，已经引用则不能修改为无效
		if ((CommonConstants.CORP_STATUS_0 == fwDeptDTO.getStatus()) && (this.validationCorp(fwDeptDTO.getDeptId())))
		{
			return CommonConstants.CORP_USER_QUOTED;
		}

		if (fwDeptTemp == null)
		{
			fwDeptTemp = new FwDept();
		}
		BeanUtils.copyProperties(fwDeptTemp, fwDeptDTO);
		//fwDeptTemp.setRegionRange(CommonUtils.arrayToString(fwDeptDTO.getRegionRanges(), CommonConstants.SPLIT_SYMBOL_COMMA));
		fwDeptDAO.update(fwDeptTemp);
		return ResultConstants.UPDATE_SUCCEED;
	}

	/**
	 * 根据单位ID获取单位对应的区域范围信息
	 * @param DeptId　单位ID
	 * @return　区域信息
	 * @throws Exception 
	 */
	public String getRegionByCorpId(Integer DeptId) throws Exception
	{
		//List<FSysRegion> regionList = sysRegionBO.findAll();
		StringBuilder result = new StringBuilder();
//		for (FSysRegion sysRegion : regionList)
//		{
//			//如果单位ID为空或者为０,说明选择的“无上级单位”，则将所有区域信息都展示出来
//			if ((DeptId == null) || (DeptId == 0))
//			{
//				result.append("<input class='validate-one-required' type='checkbox' name='regionRanges' value='"
//						+ sysRegion.getRegionId() + "'>&nbsp;" + sysRegion.getRegionName());
//			} else
//			//如果选择了上级单位，则展示上级单位对应的区域范围信息
//			{
//				FSysDeptDTO sysDeptDTO = this.findById(DeptId);
//				if (sysDeptDTO.getRegionRange().indexOf(sysRegion.getRegionId().toString()) >= 0)
//				{
//					result.append("<input class='validate-one-required' type='checkbox' name='regionRanges' value='"
//							+ sysRegion.getRegionId() + "'>&nbsp;" + sysRegion.getRegionName());
//				}
//			}
//		}
		return result.toString();
	}

	/**
	 * 根据父单位ID查询下级单位
	 * @param parentId　父单位ID
	 * @return　返回下级单位
	 * @throws Exception
	 */
	public List<FwDept> queryByParentId(Integer parentId) throws Exception
	{
		return fwDeptDAO.findByProperty("parentDeptId", parentId);
	}

}
